package com._reflect;

import com.google.common.annotations.VisibleForTesting;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

/**
 * @author huangya
 * @date 2022/8/2
 */
public class _ChangeStaticFinalVar {

    private static final String aaa="1";

    private static final KKK kkk=null;

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        _ChangeStaticFinalVar csf = new _ChangeStaticFinalVar();
        Field aaaField = csf.getClass().getDeclaredField("aaa");
        aaaField.setAccessible(true);

        Field modifiers = Field.class.getDeclaredField("modifiers");
        modifiers.setAccessible(true);
        modifiers.setInt(aaaField, aaaField.getModifiers() & ~Modifier.FINAL);

        Field kkkField = csf.getClass().getDeclaredField("kkk");
        kkkField.setAccessible(true);
        modifiers.setInt(kkkField, kkkField.getModifiers() & ~Modifier.FINAL);

        aaaField.set(null, "2");
        kkkField.set(null, new KKK("3"));
        /** 通过反射拿的值被改变了，但原值并没有改变 */
        System.out.println(aaaField.get(csf));
        /** 通过反射拿的值被改变了，但原值并没有改变 */
        fff();
        /** 【通过反射拿的值被改变了，引用类型，原值被改变】 */
        fff2();
        /** 通过反射拿的值被改变了，但原值并没有改变 */
        System.out.println(_ChangeStaticFinalVar.aaa);
    }

    public static void fff(){
        System.out.println(_ChangeStaticFinalVar.aaa);
    }
    public static void fff2(){
        System.out.println(kkk.getK());
    }

}

class KKK{
    public String k = "1";

    public KKK(String k) {
        this.k = k;
    }

    public String getK() {
        return k;
    }

    public void setK(String k) {
        this.k = k;
    }
}
